home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 398 / 398.xpi / chrome / forecastfox.jar / content / utilities / helpers.js < prev    next >
Text File  |  2010-02-04  |  18KB  |  565 lines

  1. /*------------------------------------------------------------------------------
  2.   Copyright (c) 2008 Ensolis, LLC. All Rights Reserved.
  3.   ----------------------------------------------------------------------------*/
  4.   
  5. /******************************************************************************
  6.  * WARNING!!! This file cannot be used from the main overlay (forecastfox.js).
  7.  *            There are variables and functions that conflict with browser 
  8.  *            code and could potentially conflict with other extensions.
  9.  *****************************************************************************/ 
  10.  
  11. /******************************************************************************
  12.  * Component Constants
  13.  *****************************************************************************/ 
  14. const Cc = Components.classes;
  15. const Ci = Components.interfaces;
  16. const Cr = Components.results;
  17.  
  18. /******************************************************************************
  19.  * File Permission Constants
  20.  *****************************************************************************/ 
  21. /*jsl:ignore*/
  22. const PERMS_FILE = 0644;
  23. const PERMS_DIRECTORY = 0755;
  24. /*jsl:end*/
  25.  
  26. /******************************************************************************
  27.  * File Type Constants
  28.  *****************************************************************************/
  29. const TYPE_PROFILE = Ci.ffIDiskService.TYPE_PROFILE;
  30. const TYPE_CACHE = Ci.ffIDiskService.TYPE_CACHE;
  31. const TYPE_ICONS = Ci.ffIDiskService.TYPE_ICONS;
  32. const TYPE_TEMP = Ci.ffIDiskService.TYPE_TEMP;
  33. const TYPE_DEFAULTS = Ci.ffIDiskService.TYPE_DEFAULTS;
  34. const TYPE_WEATHERFOX = Ci.ffIDiskService.TYPE_WEATHERFOX;
  35. const TYPE_ERRORS = Ci.ffIDiskService.TYPE_ERRORS;
  36.  
  37. /******************************************************************************
  38.  * Severity Constants
  39.  *****************************************************************************/
  40. const SEVERITY_INFO = Ci.ffIErrorItem.SEVERITY_INFO;
  41. const SEVERITY_WARNING = Ci.ffIErrorItem.SEVERITY_WARNING;
  42. const SEVERITY_ERROR = Ci.ffIErrorItem.SEVERITY_ERROR;
  43.  
  44. const ONE_SECOND = 1000;
  45. const ONE_MINUTE = 60*ONE_SECOND;
  46. const ONE_HOUR = 60*ONE_MINUTE;
  47. const ONE_DAY = 24*ONE_HOUR;
  48. const ONE_WEEK = 7*ONE_DAY;
  49. const ONE_MONTH = 4*ONE_WEEK;
  50.  
  51. /******************************************************************************
  52.  * Preferences Excluded from Profiles Constant
  53.  *****************************************************************************/
  54. const EXCLUDED_PREFS = {
  55.   "migrated": true,
  56.   "migrated.prefs": true,
  57.   "pinged": true,
  58.   "icons.version": true,
  59.   "icons.uninstallfiles": true,
  60.   "onetime.chromepromo": true,
  61.   "profile.current": true,
  62.   "profile.switch.delay": true,
  63.   "profile.switch.enabled": true,      
  64.   "links.alert": true,
  65.   "links.dialog": true,
  66.   "links.panel": true,
  67.   "links.context": true,
  68.   "pinged.daily": true,
  69.   "pinged.weekly": true,
  70.   "pinged.monthly": true,
  71.   "debug": true
  72. };
  73.  
  74. /******************************************************************************
  75.  * DTD and Namespace Constants for Import, Export, and Profiles.xml
  76.  *****************************************************************************/
  77. const PROFILES_DTD = "http://forecastfox.ensolis.com/specs/1.0/profiles.dtd";
  78. const PROFILES_NS = "http://forecastfox.ensolis.com/specs/1.0/profiles";
  79.  
  80. /******************************************************************************
  81.  * Gets a preference branch.  
  82.  *
  83.  * @param   Boolean if getting the default branch or current branch.
  84.  * @param   Name of the branch to get.  If null is passed then "forecastfox."
  85.  *          is the branch retrieved.
  86.  * @return  Requested preference branch.
  87.  *****************************************************************************/
  88. function getBranch(aDefault, aName)
  89. {
  90.   //forecastf pref branch
  91.   const FF_NAME = "forecastfox.";
  92.   
  93.   //get pref service
  94.   var pbSvc = Cc["@mozilla.org/preferences-service;1"].
  95.               getService(Ci.nsIPrefService);
  96.   
  97.   //get the default branch
  98.   if (aDefault)
  99.     return (aName) ? pbSvc.getDefaultBranch(aName) : 
  100.                      pbSvc.getDefaultBranch(FF_NAME);
  101.   
  102.   //get the specified branch
  103.   return (aName) ? pbSvc.getBranch(aName) : 
  104.                    pbSvc.getBranch(FF_NAME);
  105. }
  106.  
  107. /******************************************************************************
  108.  * Gets a preference.  
  109.  *
  110.  * @param   Name of the preference to retrieve.
  111.  * @return  Requested preference value. 
  112.  *****************************************************************************/
  113. var gHelpersBranch = null;
  114. function getPref(aName)
  115. {
  116.   //get pref branch
  117.   if (!gHelpersBranch)
  118.     gHelpersBranch = getBranch(false, null);
  119.   var branch = gHelpersBranch;
  120.   
  121.   //return value based on pref type
  122.   var rv = "";
  123.   switch (branch.getPrefType(aName)) {
  124.   case Ci.nsIPrefBranch.PREF_INT:
  125.     rv = branch.getIntPref(aName);
  126.     break;
  127.   case Ci.nsIPrefBranch.PREF_BOOL:
  128.     rv = branch.getBoolPref(aName);
  129.     break;
  130.   case Ci.nsIPrefBranch.PREF_STRING:
  131.   default:
  132.     try {
  133.       rv = branch.getComplexValue(aName, Ci.nsIPrefLocalizedString).data;                         
  134.     } catch(e) {
  135.       try {
  136.         rv = branch.getComplexValue(aName, Ci.nsISupportsString).data;
  137.       } catch(e) {
  138.         rv = branch.getCharPref(aName); 
  139.       }
  140.     }
  141.     break;    
  142.   }
  143.   return rv; 
  144. }
  145.  
  146. /******************************************************************************
  147.  * Sets a preference.  
  148.  *
  149.  * @param   Name of the preference to retrieve.
  150.  * @param   Value to set the preference to.
  151.  *****************************************************************************/
  152. function setPref(aName, aValue)
  153. {
  154.   //get pref branch
  155.   if (!gHelpersBranch)
  156.     gHelpersBranch = getBranch(false, null);
  157.   var branch = gHelpersBranch;
  158.   
  159.   //do nothing if value is unchanged
  160.   var oldValue = getPref(aName);
  161.   if (aValue == oldValue)
  162.     return;
  163.   
  164.   //remove user value if same as the default
  165.   var restored = restorePref(aName, aValue);
  166.   if (restored)
  167.     return;
  168.     
  169.   //set value based on pref type
  170.   switch (branch.getPrefType(aName)) {
  171.   case Ci.nsIPrefBranch.PREF_INT:
  172.     branch.setIntPref(aName, aValue);
  173.     break;
  174.   case Ci.nsIPrefBranch.PREF_BOOL:
  175.      branch.setBoolPref(aName, aValue);
  176.      break;
  177.   case Ci.nsIPrefBranch.PREF_STRING:
  178.   default:
  179.     try {
  180.       var plString = Cc["@mozilla.org/pref-localizedstring;1"].
  181.                      createInstance(Ci.nsIPrefLocalizedString);    
  182.       plString.data = aValue;
  183.       branch.setComplexValue(aName, Ci.nsIPrefLocalizedString, plString);
  184.     } catch(e) {
  185.       try {
  186.         var sString = Cc["@mozilla.org/supports-string;1"].
  187.                       createInstance(Ci.nsISupportsString);    
  188.         sString.data = aValue;
  189.         branch.setComplexValue(aName, Ci.nsISupportsString, sString);
  190.       } catch(e) {
  191.         branch.setCharPref(aName, aValue);
  192.       }
  193.     }
  194.     break;                         
  195.   }   
  196. }
  197.  
  198. /******************************************************************************
  199.  * Restores a default preference.  
  200.  *
  201.  * @param   Name of the preference to retrieve.
  202.  * @param   The new value of the preference.
  203.  * @return  True if pref was restored 
  204.  *****************************************************************************/
  205. function restorePref(aName, aValue)
  206. {
  207.   //get pref branch
  208.   var branch = getBranch(true, null);
  209.   
  210.   //get value based on pref type
  211.   try {
  212.     var defaultValue = "";
  213.     switch (branch.getPrefType(aName)) {
  214.     case Ci.nsIPrefBranch.PREF_INT:
  215.       defaultValue = branch.getIntPref(aName);
  216.       break;
  217.     case Ci.nsIPrefBranch.PREF_BOOL:
  218.       defaultValue = branch.getBoolPref(aName);
  219.       break;
  220.     case Ci.nsIPrefBranch.PREF_STRING:
  221.     default:
  222.       try {
  223.         defaultValue = branch.getComplexValue(aName, Ci.nsIPrefLocalizedString).data;                         
  224.       } catch(e) {
  225.         try {
  226.           defaultValue = branch.getComplexValue(aName, Ci.nsISupportsString).data;
  227.         } catch(e) {
  228.           defaultValue = branch.getCharPref(aName); 
  229.         }
  230.       }
  231.       break;    
  232.     }
  233.   } catch(e) {
  234.     return false;
  235.   }
  236.   
  237.   //value is the same do not restore
  238.   if (aValue != defaultValue)
  239.     return false;
  240.   
  241.   //get pref branch
  242.   if (!gHelpersBranch)
  243.     gHelpersBranch = getBranch(false, null);
  244.   branch = gHelpersBranch;
  245.   
  246.   //clear the value
  247.   try {
  248.     branch.clearUserPref(aName); 
  249.   } catch(e) {
  250.     return false;
  251.   }
  252.   
  253.   // preference was cleared
  254.   return true;
  255. }
  256.  
  257. /******************************************************************************
  258.  * removes the specified file
  259.  * 
  260.  * @param     File to remove.  If file is a directory all files within the 
  261.  *            directory will be removed.
  262.  *****************************************************************************/
  263. function removeFile(aFile)
  264. {
  265.   if (aFile.isDirectory())
  266.     aFile.remove(true);
  267.   else
  268.     aFile.remove(false);
  269. }
  270.  
  271. /******************************************************************************
  272.  * Gets a directory based on a special directory key.  
  273.  *
  274.  * @param   Special directory key.
  275.  * @param   Array of sub directories from the special directory.
  276.  * @param   Create the sub directory if it doesn't exist.
  277.  * @return  A nsIFile interface for the requested file.
  278.  *****************************************************************************/
  279. function getKeyedDirectory(aKey, aPathArray, aCreate)
  280. {
  281.   //get directory service
  282.   var dirSvc = Cc["@mozilla.org/file/directory_service;1"].
  283.                getService(Ci.nsIProperties);
  284.   
  285.   //get base directory             
  286.   var dir = dirSvc.get(aKey, Ci.nsIFile);
  287.   
  288.   //loop through path array
  289.   for (var i=0; i<aPathArray.length; i++) {      
  290.     dir.append(aPathArray[i]);
  291.     
  292.     //create directory if instructed
  293.     if (aCreate && !dir.exists())
  294.       dir.create(Ci.nsIFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
  295.   }
  296.  
  297.   return dir;
  298. }
  299.  
  300. /******************************************************************************
  301.  * Gets a directory from the installed directory.  
  302.  *
  303.  * @param   Array of sub directories from the install directory.
  304.  * @return  A nsIFile interface for the requested file.
  305.  *****************************************************************************/
  306. function getInstallDirectory(aPathArray)
  307. {
  308.   //setup objects
  309.   var dir = null;
  310.   
  311.   //get extension manager - toolkit 1.0 or greater
  312.   if ("@mozilla.org/extensions/manager;1" in Cc) {
  313.     var em = Cc["@mozilla.org/extensions/manager;1"].
  314.              getService(Ci.nsIExtensionManager);
  315.              
  316.     //get install location from extension manager - toolkit 1.5            
  317.     if ("nsIInstallLocation" in Ci) {
  318.       dir = em.getInstallLocation("{0538E3E3-7E9B-4d49-8831-A227C80A7AD3}");
  319.       dir = dir.getItemLocation("{0538E3E3-7E9B-4d49-8831-A227C80A7AD3}");
  320.     }   
  321.   }
  322.     
  323.   //couldn't use extension manager so try the profile directory - non toolkit
  324.   if (!dir) {
  325.     var dirSvc = Cc["@mozilla.org/file/directory_service;1"].
  326.                  getService(Ci.nsIProperties);      
  327.     dir = dirSvc.get("ProfD", Ci.nsIFile);
  328.     dir.append("extensions");
  329.     dir.append("{0538E3E3-7E9B-4d49-8831-A227C80A7AD3}");
  330.     
  331.     //not in the profile directory so it must be in the app directory
  332.     if (!dir.exists()) {
  333.       dir = dirSvc.get("XCurProcD", Ci.nsIFile); 
  334.       dir.append("extensions");
  335.       dir.append("{0538E3E3-7E9B-4d49-8831-A227C80A7AD3}");
  336.     }      
  337.   }
  338.   
  339.   //loop through path array
  340.   for (var i=0; i<aPathArray.length; i++)
  341.     dir.append(aPathArray[i]);
  342.  
  343.   return dir;
  344. }
  345.    
  346. /******************************************************************************
  347.  * Get the top most open window.  A window has to open for this to be called.
  348.  * Use this if the type of window does not matter.
  349.  * 
  350.  * @return  A window object used for modality.
  351.  *****************************************************************************/
  352. function getTopWindow()
  353. {
  354.   //get top window
  355.   var mediator = Cc["@mozilla.org/appshell/window-mediator;1"].
  356.                  getService(Ci.nsIWindowMediator);
  357.   return mediator.getMostRecentWindow(null); 
  358. }
  359.    
  360. /******************************************************************************
  361.  * Get the main application window.  Use this if the type of window does matter.
  362.  * 
  363.  * @return  A window object used for modality.
  364.  *****************************************************************************/
  365. function getMainWindow()
  366. {
  367.   /** this may need to change if main window of a 
  368.       supported app is not "navigator:browser" **/
  369.   
  370.   //get the mediator service
  371.   var mediator = Cc["@mozilla.org/appshell/window-mediator;1"].
  372.                  getService(Ci.nsIWindowMediator);
  373.   
  374.   //get the app window
  375.   var main = mediator.getMostRecentWindow("navigator:browser");
  376.   if (main)
  377.     return main;
  378.                        
  379.   //get the watcher service
  380.   var watcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].
  381.                 getService(Ci.nsIWindowWatcher);                 
  382.  
  383.   //open a new window    
  384.   main = watcher.openWindow(null, "chrome://browser/content/browser.xul", 
  385.                             "_blank", "chrome,all,dialog=no", "about:blank"); 
  386.   return main;
  387. }
  388.      
  389. /******************************************************************************
  390.  * String enumerator of hash table keys.
  391.  * 
  392.  * @param   Javascript hash table. 
  393.  * @return  A nsIStringEnumerator of the keys.
  394.  *****************************************************************************/
  395. function KeyEnumerator(aHashTable)
  396. {
  397.   //setup key array
  398.   this._keys = [];
  399.   this._index = 0;
  400.   
  401.   //load with data
  402.   if (aHashTable) {
  403.     for (var name in aHashTable)
  404.       this._keys.push(name);
  405.   }
  406. }
  407. KeyEnumerator.prototype = {
  408.   _index: null,
  409.   _keys: null,
  410.   
  411.   QueryInterface: function KeyEnumerator_QueryInterface(aIID)
  412.   {
  413.     if (!aIID.equals(Ci.nsIStringEnumerator) ||
  414.         !aIID.equals(Ci.nsISupports))
  415.       throw Cr.NS_ERROR_NO_INTERFACE; 
  416.     return this;   
  417.   },
  418.   
  419.   hasMore: function KeyEnumerator_hasMore()
  420.   {
  421.     return this._index < this._keys.length;
  422.   },
  423.   
  424.   getNext: function KeyEnumerator_getNext()
  425.   {
  426.     var rv = this._keys[this._index];
  427.     this._index++; 
  428.     return rv;
  429.   }
  430. };
  431.  
  432. /******************************************************************************
  433.  * Sorts an array ascending where the items have a name property. 
  434.  *
  435.  * @param   Current array item.
  436.  * @param   Next array item.
  437.  *
  438.  * @return  1 if greater, 0 if equal, and -1 if less than. 
  439.  *****************************************************************************/
  440. function sortByName(aItem1, aItem2)
  441. {
  442.   if (aItem1.name < aItem2.name)
  443.     return -1;
  444.   else if (aItem1.name == aItem2.name)
  445.     return 0;
  446.  
  447.   return 1;
  448. }
  449.  
  450. /******************************************************************************
  451.  * Get a new prompter.
  452.  *
  453.  * @param   The parent window for the prompter can be null.
  454.  *
  455.  * @return  A new prompter. 
  456.  *****************************************************************************/
  457. function getPrompter(aParent)
  458. {
  459.   //get the watcher service
  460.   var watcher = Cc["@mozilla.org/embedcomp/window-watcher;1"].
  461.                 getService(Ci.nsIWindowWatcher);
  462.                 
  463.   //return a prompter
  464.   return watcher.getNewPrompter(aParent);
  465. }
  466.  
  467. /******************************************************************************
  468.  * Gets the forecastfox string bundle.
  469.  *
  470.  * @return  A nsIStringBundle interface for the requested url.
  471.  *****************************************************************************/
  472. var gHelpersBundle = null;
  473. function getBundle()
  474. {
  475.   if (gHelpersBundle != null)
  476.     return gHelpersBundle;
  477.     
  478.   const BUNDLE_URL = "chrome://forecastfox/locale/forecastfox.properties";
  479.  
  480.   //get the stringbundle service
  481.   var sbSvc = Cc["@mozilla.org/intl/stringbundle;1"].
  482.               getService(Ci.nsIStringBundleService); 
  483.   
  484.   //get the bundle and return it  
  485.   gHelpersBundle = sbSvc.createBundle(BUNDLE_URL);       
  486.   return gHelpersBundle;
  487. }
  488.  
  489. /******************************************************************************
  490.  * Checks if the alert service is included.
  491.  *
  492.  * @return  True if alert service is present. 
  493.  *****************************************************************************/
  494. var gHelpersHasAlert = null;
  495. function checkAlertService()
  496. {
  497.   //return cached alert check
  498.   if (gHelpersHasAlert != null) 
  499.     return gHelpersHasAlert;
  500.  
  501.   //check if the alert interface exists
  502.   if ("nsIAlertsService" in Ci)
  503.     gHelpersHasAlert = true;
  504.   else
  505.     gHelpersHasAlert = false;
  506.     
  507.   //cache the flag and return the value
  508.   return gHelpersHasAlert;
  509. }
  510.  
  511. /******************************************************************************
  512.  * Open a link in the main application window
  513.  *
  514.  * @param   The url to open.
  515.  * @param   Where to open the link (current, window, tab, tabshifted)
  516.  *****************************************************************************/ 
  517. function openLink(aURL, aWhere)
  518. {
  519.   var win = getMainWindow();
  520.   var browser = win.document.getElementById("content");
  521.   var features = "chrome,all,dialog=no";
  522.   var chrome = "";
  523.   switch (aWhere) {
  524.   
  525.   //open in a new window
  526.   case "window":
  527.     chrome = "chrome://browser/content/browser.xul";    
  528.     win.openDialog(chrome, "_blank", features, aURL, null, null);
  529.     break;
  530.     
  531.   //open in a new tab
  532.   case "tab":
  533.   case "tabshifted":
  534.     var tab = browser.addTab(aURL);
  535.     
  536.     //focus the tab
  537.     if (aWhere == "tab") {
  538.       browser.selectedTab = tab;
  539.       win.content.focus();
  540.     }        
  541.     break;
  542.     
  543.   //open in the current tab
  544.   case "current":
  545.   default: 
  546.     browser.loadURI(aURL);
  547.     win.content.focus();
  548.     break;
  549.   }
  550. }
  551.  
  552. /******************************************************************************
  553.  * write a message to the console and to stdout
  554.  *
  555.  * @param   Values to log.
  556.  *****************************************************************************/  
  557. function LOG(values) {
  558.   var debug = getPref("debug");
  559.   if (debug === true) {
  560.     var msg =(values.join ? values.join("") : values);
  561.     console = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
  562.     console.logStringMessage(msg);
  563.     dump(msg + "\n");
  564.   }
  565. }